package interceptor;

import com.zhaowudi.wj.pojo.User;
import org.apache.commons.lang.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LoginInterceptor  implements HandlerInterceptor{
    /*
用来拦截处理器的执行，preHandle方法将在Controller处理之前调用的。
SpringMVC里可以同时存在多个interceptor，它们基于链式方式调用，每个interceptor都根据其声明顺序依次执行。
这种链式结构可以中断，当方法返回false时整个请求就结束了。

方法的返回值是布尔类型，方法如果返回false，那后面的interceptor和Controller都不会执行(通常都会响应一个自定义的 Http 错误码给客户端)。
如果返回值为true，则接着调用下一个interceptor的preHandle方法。
如果当前是最后一个interceptor，接下来就会直接调用Controller的处理方法。
     */
    @Override
    public boolean preHandle (HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        HttpSession session = httpServletRequest.getSession();
        String contextPath=session.getServletContext().getContextPath();

        String[] requireAuthPages = new String[]{
                "index",
        };
        //getRequestURI() 获取ip和端口之后的地址
        String uri = httpServletRequest.getRequestURI();

        uri = StringUtils.remove(uri, contextPath+"/");
        String page = uri;

        if(begingWith(page, requireAuthPages)){
            //判断 session 中是否存在 user 属性，如果存在就放行，如果不存在就跳转到 login 页面。
            User user = (User) session.getAttribute("user");
            if(user==null) {
                httpServletResponse.sendRedirect("login");
                return false;
            }
        }
        return true;
    }
    /*
    使用了一个路径列表（requireAuthPages），可以在里面写下需要拦截的路径。当然我们也可以拦截所有路径，那样就不用写这么多了，
    但会有逻辑上的问题，就是你访问了 \login 页面，仍然会需要跳转，这样就会引发多次重定向问题
     */
    private boolean begingWith(String page, String[] requiredAuthPages) {
        boolean result = false;
        for (String requiredAuthPage : requiredAuthPages) {
            if(StringUtils.startsWith(page, requiredAuthPage)) {
                result = true;
                break;
            }
        }
        return result;
    }
}

